﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;


namespace ConsoleApp1
{
    public class Solution23
    {/// <summary>
     /// 买卖股票的最佳时机
     /// </summary>
     /// <param name="prices"></param>
     /// <returns></returns>
        public int MaxProfit(int[] prices)
        {
            int maxProfit = 0;
            for (int i = 0; i < prices.Length - 1; i++)
            {
                for (int j = i + 1; j < prices.Length; j++)
                {
                    int profit = prices[j] - prices[i];
                    if (profit > maxProfit)
                    {
                        maxProfit = profit;
                    }
                }
            }
            return maxProfit;
        }
        //public int MaxProfit(int[] prices)
        //{
        //    int min = int.MaxValue;
        //    int max = 0;
        //    for (int i = 0; i < prices.Length; i++)
        //    {
        //        if (prices[i] < min)
        //        {
        //            min = prices[i];
        //        }
        //        else if (prices[i] - min >max)
        //        {
        //            max = prices[i] - min;
        //        }
        //    }
        //    return max;
        //}

    }
    //public class Foo
    //{

    //    public Foo()
    //    {
               
    //    }
    //    bool isFirst = false;
    //    bool isSecond = false;
    //    public void First(Action printFirst)
    //    {

    //        // printFirst() outputs "first". Do not change or remove this line.
    //        printFirst();
    //        isFirst = true;
    //    }

    //    public void Second(Action printSecond)
    //    {
    //        while (!isFirst)
    //        {
    //            Thread.Sleep(1);
    //            if (isFirst)
    //            {
    //                break;
    //            }
    //        }
    //        // printSecond() outputs "second". Do not change or remove this line.
           
    //        printSecond();
    //        isFirst = false;
    //        isSecond = true;
    //    }

    //    public void Third(Action printThird)
    //    {
    //        while (!isSecond)
    //        {
    //            Thread.Sleep(1);
    //            if (isSecond)
    //            {
    //                break;
    //            }
    //        }
    //        // printThird() outputs "third". Do not change or remove this line.

    //        printThird();
    //        isFirst = false;
    //        isSecond = false;
    //    }
    //}
    public class Foo1
    {

        public Foo1()
        {

        }
        Semaphore sem1 = new Semaphore(0,1);//限制请求的最大请求数
        Semaphore sem2 = new Semaphore(0,1);
        public void First(Action printFirst)
        {

            // printFirst() outputs "first". Do not change or remove this line.
            printFirst();
            sem1.Release();
        }

        public void Second(Action printSecond)
        {
            sem1.WaitOne();  //阻止当前线程知道当前线程收到信号为止。
            // printSecond() outputs "second". Do not change or remove this line.
            printSecond();
            sem2.Release();
        }

        public void Third(Action printThird)
        {
            sem2.WaitOne();
            // printThird() outputs "third". Do not change or remove this line.
            printThird();
        }
    }
}
